/**
 * Created with IntelliJ IDEA.
 * Description: 牛客网: BM85 验证IP地址
 * <a href="https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880?tpId=295&tqId=1024725&ru=/exam/company&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Fcompany">...</a>
 * User: DELL
 * Date: 2023-06-26
 * Time: 18:06
 */
public class Solution {
    private static final String IPv4 = "IPv4";
    private static final String IPv6 = "IPv6";
    private static final String NEITHER = "Neither";

    /**
     * 这里面就是简单的逻辑进行判断
     * 其中值得注意的是我使用的分解字符串的库函数为 split() 函数,
     * 而该函数会在匹配的时候,若最后一个字符串为空会丢掉,而第一个匹
     * 配到的为空的字符串不会丢掉,即 ":abc:" 字符串被分解后会生成
     * 长度为 2 的字符串数组, 即 {"", "abc"},因此在进行逻辑判断
     * 的时候要判断最后一个字符是不是要分解的字符.
     * @param IP
     * @return
     */
    public String solve (String IP) {
        if (judge(IP) == 1) {
            // 判断最后一个字符
            if (IP.charAt(IP.length()-1) == '.') {
                return NEITHER;
            }
            String[] temp = IP.split("\\.");
            if (temp.length == 4) {
                for (int i = 0; i < 4; i++) {
                    if (!judgeIsIPv4(temp[i])) {
                        return NEITHER;
                    }
                }
                return IPv4;
            }
            return NEITHER;
        } else {
            // 判断最后一个字符
            if (IP.charAt(IP.length()-1) == ':') {
                return NEITHER;
            }
            String[] temp = IP.split(":");
            if (temp.length == 8) {
                for (int i = 0; i < 8; i++) {
                    if (!judgeIsIPv6(temp[i])) {
                        return NEITHER;
                    }
                }
                return IPv6;
            }
            return IPv6;
        }
    }

    /**
     * 判断当前IP是IPv4还是IPv6
     * @param IP
     * @return  不合法返回  -1
     *          是IPv4返回 1
     *          是IPv6返回 2
     */
    private static int judge(String IP) {
        boolean flag1 = false;
        boolean flag2 = false;
        for (int i = 0; i < IP.length(); i++) {
            if (IP.charAt(i) == '.') {
                flag1 = true;
            } else if (IP.charAt(i) == ':'){
                flag2 = true;
            }
        }
        if (flag1 && flag2) {
            return -1;
        } else if (flag1) {
            return 1;
        } else {
            return 2;
        }
    }

    /**
     * 判断分解后的每一个子字符串是否符合 IPv4 的要求
     * @param temp
     * @return
     */
    private static boolean judgeIsIPv4 (String temp) {
        if (temp == null || temp.length() == 0 || temp.length() > 3) {
            return false;
        }
        // 判断是否含有不合法的字符
        for (int i = 0; i < temp.length(); i++) {
            if (temp.charAt(i) < '0' || temp.charAt(i) > '9') {
                return false;
            }
        }
        // 以 0 开头
        if (temp.charAt(0) == '0' && temp.length() != 1) {
            return false;
        }
        // 数字范围
        int num = Integer.parseInt(temp);
        if (num < 0 || num > 255) {
            return false;
        }
        return true;
    }

    /**
     * 判断分解后的每一个子字符串是否符合 IPv6 的要求
     * @param temp
     * @return
     */
    private static boolean judgeIsIPv6 (String temp) {
        if (temp == null || temp.length() == 0 || temp.length() > 4) {
            return false;
        }
        // 判断是否含有不合法的字符
        for (char ch : temp.toCharArray()) {
            if (!(ch >= '0' && ch <= '9')
                    && !(ch >= 'A' && ch <= 'F')
                    && !(ch >= 'a' && ch <= 'f')) {
                return false;
            }
        }
        return true;
    }
}
